/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.collections;
import java.util.Collection;
import java.util.ConcurrentModificationException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;
import junit.framework.Test;
import org.apache.commons.collections.map.AbstractTestMap;
/**
* Class TestDoubleOrderedMap
* <p>
* Test cases for DoubleOrderedMap. This class cannot
* implement TestMap.SupportsPut, because it is a special
* Map that does not support duplicate keys, duplicate
* values, or null values.
*
* @version $Revision: 646780 $ $Date: 2008-04-10 13:48:07 +0100 (Thu, 10 Apr 2008) $
*
* @author Marc Johnson
* @author Stephen Colebourne
*/
public class TestDoubleOrderedMap extends AbstractTestMap {
/**
* constructor
*
* @param name
*/
public TestDoubleOrderedMap(final String name) {
super(name);
}
/**
* create a suite of the tests in this class
*
* @return the test suite
*/
public static Test suite() {
return BulkTest.makeSuite(TestDoubleOrderedMap.class);
}
/**
* The default comparator in double ordered map does not allow null keys.
**/
public boolean isAllowNullKey() {
return false;
}
/**
* The default comparator in double ordered map does not allow null keys,
* and values are keys in this map.
**/
public boolean isAllowNullValue() {
return false;
}
/**
* Double ordered map does not support duplicate values
**/
public boolean isAllowDuplicateValues() {
return false;
}
/**
* Change the Map.put() test because it tries put with the same key
* which is invalid in the modified double ordered map contract. (The
* DoubleOrderedMap documentation states that an IllegalArgumentException
* is thrown when a key is tried to be put into the map again. This
* differs from the standard Map contract which would replace the value
* for that key and return it.
*/
public boolean isPutChangeSupported() {
return false;
}
/**
* setValue() is not supported as it can change the map.
*/
public boolean isSetValueSupported() {
return false;
}
public Map makeEmptyMap() {
return new DoubleOrderedMap();
}
protected Map makeMap() {
return new DoubleOrderedMap();
}
/**
* test size() method
*/
public void testSize() {
Map m = makeMap();
assertEquals(0, m.size());
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k].getValue());
assertEquals(k + 1, m.size());
}
int count = m.size();
for (int k = 0; k < nodes.length; k++) {
m.remove(nodes[k].getKey());
--count;
assertEquals(count, m.size());
// failed remove should not affect size
m.remove(nodes[k].getKey());
assertEquals(count, m.size());
}
}
/**
* test IsEmpty() method
*/
public void testIsEmpty() {
Map m = makeMap();
assertTrue(m.isEmpty());
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k].getValue());
assertTrue(!m.isEmpty());
}
int count = m.size();
for (int k = 0; k < nodes.length; k++) {
m.remove(nodes[k].getKey());
--count;
if (count == 0) {
assertTrue(m.isEmpty());
} else {
assertTrue(!m.isEmpty());
}
// failed remove should not affect emptiness
m.remove(nodes[k].getKey());
if (count == 0) {
assertTrue(m.isEmpty());
} else {
assertTrue(!m.isEmpty());
}
}
}
/**
* test containsKey() method
*/
public void testContainsKey() {
Map m = makeMap();
try {
m.containsKey(new Object());
fail("should have caught ClassCastException");
} catch (ClassCastException ignored) {}
try {
m.containsKey(null);
fail("should have caught NullPointerException");
} catch (NullPointerException ignored) {}
assertTrue(!m.containsKey("foo"));
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
assertTrue(m.containsKey(nodes[k].getKey()));
}
assertTrue(!m.containsKey(new Integer(-1)));
try {
m.containsKey("foo");
fail("Should have caught ClassCastException");
} catch (ClassCastException ignored) {}
for (int k = 0; k < nodes.length; k++) {
m.remove(nodes[k].getKey());
assertTrue(!m.containsKey(nodes[k].getKey()));
}
}
/**
* test containsValue() method
*/
public void testContainsValue() {
Map m = (DoubleOrderedMap) makeMap();
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
assertTrue(m.containsValue(nodes[k]));
}
for (int k = 0; k < nodes.length; k++) {
m.remove(nodes[k].getKey());
assertTrue(!m.containsValue(nodes[k]));
}
}
/**
* test get() method
*/
public void testGet() {
Map m = makeMap();
try {
m.get(new Object());
fail("should have caught ClassCastException");
} catch (ClassCastException ignored) {}
try {
m.get(null);
fail("should have caught NullPointerException");
} catch (NullPointerException ignored) {}
assertNull(m.get("foo"));
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
assertSame(m.get(nodes[k].getKey()), nodes[k]);
}
assertNull(m.get(new Integer(-1)));
try {
m.get("foo");
fail("Should have caught ClassCastException");
} catch (ClassCastException ignored) {}
for (int k = 0; k < nodes.length; k++) {
assertNotNull(m.get(nodes[k].getKey()));
m.remove(nodes[k].getKey());
assertNull(m.get(nodes[k].getKey()));
}
}
/**
* test put() method
*/
public void testPut() {
Map m = makeMap();
try {
m.put(new Object(), "foo");
fail("should have caught ClassCastException");
} catch (ClassCastException ignored) {}
try {
m.put(null, "foo");
fail("should have caught NullPointerException");
} catch (NullPointerException ignored) {}
try {
m.put("foo", null);
fail("should have caught NullPointerException");
} catch (NullPointerException ignored) {}
try {
m.put("foo", new Object());
fail("should have caught ClassCastException");
} catch (ClassCastException ignored) {}
LocalTestNode[] nodes = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
assertNull(m.put(nodes[k].getKey(), nodes[k].getValue()));
try {
m.put(nodes[k].getKey(), "foo");
} catch (IllegalArgumentException ignored) {}
}
}
/**
* test remove() method
*/
public void testRemove() {
DoubleOrderedMap m = (DoubleOrderedMap) makeMap();
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
try {
m.remove(null);
fail("should have caught NullPointerException");
} catch (NullPointerException ignored) {}
try {
m.remove(new Object());
fail("should have caught ClassCastException");
} catch (ClassCastException ignored) {}
assertNull(m.remove(new Integer(-1)));
try {
m.remove("foo");
fail("should have caught ClassCastException");
} catch (ClassCastException ignored) {}
for (int k = 0; k < nodes.length; k += 2) {
Comparable key = nodes[k].getKey();
assertNotNull(m.get(key));
assertSame(nodes[k], m.remove(key));
assertNull(m.remove(key));
assertNull(m.get(key));
}
for (int k = 1; k < nodes.length; k += 2) {
Comparable key = nodes[k].getKey();
assertNotNull(m.get(key));
assertSame(nodes[k], m.remove(key));
assertNull(m.remove(key));
assertNull(m.get(key));
}
assertTrue(m.isEmpty());
}
/**
* Method testPutAll
*/
public void testPutAll() {
Map m = (DoubleOrderedMap) makeMap();
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
Map m1 = new HashMap();
m1.put(null, "foo");
try {
m.putAll(m1);
fail("Should have caught NullPointerException");
} catch (NullPointerException ignored) {}
m1 = new HashMap();
m1.put(new Object(), "bar");
try {
m.putAll(m1);
fail("Should have caught ClassCastException");
} catch (ClassCastException ignored) {}
m1 = new HashMap();
m1.put("fubar", null);
try {
m.putAll(m1);
fail("Should have caught NullPointerException");
} catch (NullPointerException ignored) {}
m1 = new HashMap();
m1.put("fubar", new Object());
try {
m.putAll(m1);
fail("Should have caught ClassCastException");
} catch (ClassCastException ignored) {}
assertEquals(nodes.length, m.size());
m = (DoubleOrderedMap) makeMap();
m1 = new HashMap();
for (int k = 0; k < nodes.length; k++) {
m1.put(nodes[k].getKey(), nodes[k].getValue());
}
m.putAll(m1);
assertEquals(nodes.length, m.size());
for (int k = 0; k < nodes.length; k++) {
assertSame(nodes[k].getValue(), m.get(nodes[k].getKey()));
}
}
/**
* test clear() method
*/
public void testClear() {
Map m = (DoubleOrderedMap) makeMap();
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k].getValue());
assertTrue(!m.isEmpty());
}
assertTrue(!m.isEmpty());
for (int k = 0; k < nodes.length; k++) {
assertTrue(m.containsKey(nodes[k].getKey()));
assertTrue(m.containsValue(nodes[k].getValue()));
}
m.clear();
assertTrue(m.isEmpty());
for (int k = 0; k < nodes.length; k++) {
assertTrue(!m.containsKey(nodes[k].getKey()));
assertTrue(!m.containsValue(nodes[k].getValue()));
}
}
/**
* test keySet() method
*/
public void testKeySet() {
testKeySet((DoubleOrderedMap) makeMap());
Map m = (DoubleOrderedMap) makeMap();
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
testKeySet(m);
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
int count = m.size();
for (Iterator iter = m.keySet().iterator(); iter.hasNext(); ) {
iter.next();
iter.remove();
--count;
assertEquals(count, m.size());
}
assertTrue(m.isEmpty());
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
Set s = m.keySet();
try {
s.remove(null);
fail("should have caught NullPointerException");
} catch (NullPointerException ignored) {}
try {
s.remove(new Object());
fail("should have caught ClassCastException");
} catch (ClassCastException ignored) {}
for (int k = 0; k < nodes.length; k++) {
Comparable key = nodes[k].getKey();
assertTrue(s.remove(key));
assertTrue(!s.contains(key));
assertTrue(!m.containsKey(key));
assertTrue(!m.containsValue(nodes[k]));
}
assertTrue(m.isEmpty());
m = (DoubleOrderedMap) makeMap();
Collection c1 = new LinkedList();
Collection c2 = new LinkedList();
c2.add(new Integer(-99));
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
c1.add(nodes[k].getKey());
c2.add(nodes[k].getKey());
}
assertTrue(m.keySet().containsAll(c1));
assertTrue(!m.keySet().containsAll(c2));
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
c1.add(new Integer(-55));
try {
m.keySet().addAll(c1);
fail("should have caught exception of addAll()");
} catch (UnsupportedOperationException ignored) {}
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
c1.add(nodes[k].getKey());
}
assertTrue(!m.keySet().retainAll(c1));
assertEquals(nodes.length, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
if (k % 2 == 1) {
c1.add(nodes[k].getKey());
}
}
assertTrue(m.keySet().retainAll(c1));
assertEquals(nodes.length / 2, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
assertTrue(m.keySet().retainAll(c1));
assertEquals(0, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
assertTrue(!m.keySet().removeAll(c1));
assertEquals(nodes.length, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
if (k % 2 == 0) {
c1.add(nodes[k].getKey());
}
}
assertTrue(m.keySet().removeAll(c1));
assertEquals(nodes.length / 2, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
c1.add(nodes[k].getKey());
}
assertTrue(m.keySet().removeAll(c1));
assertEquals(0, m.size());
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
m.keySet().clear();
assertEquals(0, m.size());
}
/**
* test values() method
*/
public void testValues() {
testValues((DoubleOrderedMap) makeMap());
Map m = (DoubleOrderedMap) makeMap();
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
testValues(m);
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
int count = m.size();
for (Iterator iter = m.values().iterator(); iter.hasNext(); ) {
iter.next();
iter.remove();
--count;
assertEquals(count, m.size());
}
assertTrue(m.isEmpty());
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
count = m.size();
Collection s = m.values();
for (int k = 0; k < count; k++) {
assertTrue(s.remove(nodes[k]));
assertTrue(!s.contains(nodes[k]));
assertTrue(!m.containsKey(nodes[k].getKey()));
assertTrue(!m.containsValue(nodes[k]));
}
assertTrue(m.isEmpty());
m = (DoubleOrderedMap) makeMap();
Collection c1 = new LinkedList();
Collection c2 = new LinkedList();
c2.add(new LocalTestNode(-123));
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
c1.add(nodes[k]);
c2.add(nodes[k]);
}
assertTrue(m.values().containsAll(c1));
assertTrue(!m.values().containsAll(c2));
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
c1.add(nodes[k]);
}
try {
m.values().addAll(c1);
fail("should have caught exception of addAll()");
} catch (UnsupportedOperationException ignored) {}
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
c1.add(nodes[k]);
}
assertTrue(!m.values().retainAll(c1));
assertEquals(nodes.length, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
if (k % 2 == 1) {
c1.add(nodes[k]);
}
}
assertTrue(m.values().retainAll(c1));
assertEquals(nodes.length / 2, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
assertTrue(m.values().retainAll(c1));
assertEquals(0, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
assertTrue(!m.values().removeAll(c1));
assertEquals(nodes.length, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
if (k % 2 == 0) {
c1.add(nodes[k]);
}
}
assertTrue(m.values().removeAll(c1));
assertEquals(nodes.length / 2, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
c1.add(nodes[k]);
}
assertTrue(m.values().removeAll(c1));
assertEquals(0, m.size());
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
m.values().clear();
assertEquals(0, m.size());
}
/**
* test entrySet() method
*/
public void testEntrySet() {
testEntrySet((DoubleOrderedMap) makeMap());
Map m = (DoubleOrderedMap) makeMap();
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
testEntrySet(m);
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
try {
((Map.Entry) m.entrySet().iterator().next())
.setValue(new LocalTestNode(-1));
fail("Should have caught UnsupportedOperationException");
} catch (UnsupportedOperationException ignored) {}
int count = m.size();
for (Iterator iter = m.entrySet().iterator(); iter.hasNext(); ) {
iter.next();
iter.remove();
--count;
assertEquals(count, m.size());
}
assertTrue(m.isEmpty());
m = (DoubleOrderedMap) makeMap();
Collection c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
c1.add(nodes[k].getKey());
}
try {
m.entrySet().addAll(c1);
fail("should have caught exception of addAll()");
} catch (UnsupportedOperationException ignored) {}
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
m.entrySet().clear();
assertEquals(0, m.size());
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
int x = 0;
for (Iterator iter = m.entrySet().iterator(); iter.hasNext(); ) {
Map.Entry entry = (Map.Entry) iter.next();
assertSame(entry.getKey(), nodes[x].getKey());
assertSame(entry.getValue(), nodes[x]);
x++;
}
}
/**
* Method testEquals
*/
public void testEquals() {
Map m = (DoubleOrderedMap) makeMap();
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
assertTrue(!m.equals(null));
assertEquals(m, m);
Map m1 = new HashMap();
for (int k = 0; k < nodes.length; k++) {
m1.put(nodes[k].getKey(), nodes[k]);
}
assertEquals(m, m1);
m1 = (DoubleOrderedMap) makeMap();
for (int k = 0; k < (nodes.length - 1); k++) {
m1.put(nodes[k].getKey(), nodes[k]);
}
assertTrue(!m.equals(m1));
m1 = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m1.put(nodes[k].getKey(), nodes[k]);
}
LocalTestNode node1 = new LocalTestNode(-1000);
m1.put(node1.getKey(), node1);
assertTrue(!m.equals(m1));
m1 = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m1.put(nodes[k].getKey(), nodes[nodes.length - (k + 1)]);
}
assertTrue(!m.equals(m1));
m1 = (DoubleOrderedMap) makeMap();
for (int k = nodes.length - 1; k >= 0; k--) {
m1.put(nodes[k].getKey(), nodes[k]);
}
assertEquals(m, m1);
}
/**
* test hashCode() method
*/
public void testHashCode() {
Map m = (DoubleOrderedMap) makeMap();
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
Map m1 = (DoubleOrderedMap) makeMap();
for (int k = nodes.length - 1; k >= 0; k--) {
m1.put(nodes[k].getKey(), nodes[k]);
}
assertEquals(m.hashCode(), m1.hashCode());
}
/**
* test constructors
*/
public void testConstructors() {
DoubleOrderedMap m = (DoubleOrderedMap) makeMap();
assertTrue(m.isEmpty());
DoubleOrderedMap m1 = new DoubleOrderedMap(m);
assertTrue(m1.isEmpty());
m1 = (DoubleOrderedMap) makeMap();
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m1.put(nodes[k].getKey(), nodes[k]);
}
m = new DoubleOrderedMap(m1);
assertEquals(m, m1);
Map m2 = new HashMap();
for (int k = 0; k < nodes.length; k++) {
m2.put(nodes[k].getKey(), nodes[k]);
}
m = new DoubleOrderedMap(m2);
assertEquals(m, m2);
// reject duplicated values
m2 = new HashMap();
m2.put("1", "foo");
m2.put("2", "foo");
try {
m = new DoubleOrderedMap(m2);
fail("Should have caught IllegalArgumentException");
} catch (IllegalArgumentException ignored) {}
// reject null values
m2.put("2", null);
try {
m = new DoubleOrderedMap(m2);
fail("Should have caught NullPointerException");
} catch (NullPointerException ignored) {}
// reject non-Comparable values
m2.put("2", new Object());
try {
m = new DoubleOrderedMap(m2);
fail("Should have caught ClassCastException");
} catch (ClassCastException ignored) {}
// reject incompatible values
m2.put("2", new Integer(2));
try {
m = new DoubleOrderedMap(m2);
fail("Should have caught ClassCastException");
} catch (ClassCastException ignored) {}
// reject incompatible keys
m2.remove("2");
m2.put(new Integer(2), "bad key");
try {
m = new DoubleOrderedMap(m2);
fail("Should have caught ClassCastException");
} catch (ClassCastException ignored) {}
// reject non-Comparable keys
m2.clear();
m2.put("1", "foo");
m2.put(new Object(), "bad key");
try {
m = new DoubleOrderedMap(m2);
fail("Should have caught ClassCastException");
} catch (ClassCastException ignored) {}
}
/**
* test getKeyForValue() method
*/
public void testGetKeyForValue() {
DoubleOrderedMap m = (DoubleOrderedMap) makeMap();
try {
m.getKeyForValue(new Object());
fail("should have caught ClassCastException");
} catch (ClassCastException ignored) {}
try {
m.getKeyForValue(null);
fail("should have caught NullPointerException");
} catch (NullPointerException ignored) {}
assertNull(m.getKeyForValue("foo"));
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
assertSame(m.getKeyForValue(nodes[k]), nodes[k].getKey());
}
assertNull(m.getKeyForValue(new LocalTestNode(-1)));
try {
m.getKeyForValue("foo");
fail("Should have caught ClassCastException");
} catch (ClassCastException ignored) {}
for (int k = 0; k < nodes.length; k++) {
assertNotNull(m.getKeyForValue(nodes[k]));
m.remove(nodes[k].getKey());
assertNull(m.getKeyForValue(nodes[k]));
}
}
/**
* test removeValue() method
*/
public void testRemoveValue() {
DoubleOrderedMap m = (DoubleOrderedMap) makeMap();
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
try {
m.removeValue(null);
fail("should have caught NullPointerException");
} catch (NullPointerException ignored) {}
try {
m.removeValue(new Object());
fail("should have caught ClassCastException");
} catch (ClassCastException ignored) {}
assertNull(m.remove(new Integer(-1)));
try {
m.removeValue("foo");
fail("should have caught ClassCastException");
} catch (ClassCastException ignored) {}
for (int k = 0; k < nodes.length; k += 2) {
assertNotNull(m.getKeyForValue(nodes[k]));
assertSame(nodes[k].getKey(), m.removeValue(nodes[k]));
assertNull(m.removeValue(nodes[k]));
assertNull(m.getKeyForValue(nodes[k]));
}
for (int k = 1; k < nodes.length; k += 2) {
assertNotNull(m.getKeyForValue(nodes[k]));
assertSame(nodes[k].getKey(), m.removeValue(nodes[k]));
assertNull(m.removeValue(nodes[k]));
assertNull(m.getKeyForValue(nodes[k]));
}
assertTrue(m.isEmpty());
}
/**
* test entrySetByValue() method
*/
public void testEntrySetByValue() {
testEntrySetByValue((DoubleOrderedMap) makeMap());
DoubleOrderedMap m = (DoubleOrderedMap) makeMap();
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
testEntrySetByValue(m);
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
try {
((Map.Entry) m.entrySetByValue().iterator().next())
.setValue(new LocalTestNode(-1));
fail("Should have caught UnsupportedOperationException");
} catch (UnsupportedOperationException ignored) {}
int count = m.size();
for (Iterator iter = m.entrySetByValue().iterator();
iter.hasNext(); ) {
iter.next();
iter.remove();
--count;
assertEquals(count, m.size());
}
assertTrue(m.isEmpty());
m = (DoubleOrderedMap) makeMap();
Collection c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
c1.add(nodes[k].getKey());
}
try {
m.entrySetByValue().addAll(c1);
fail("should have caught exception of addAll()");
} catch (UnsupportedOperationException ignored) {}
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
m.entrySetByValue().clear();
assertEquals(0, m.size());
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
int x = 0;
for (Iterator iter = m.entrySetByValue().iterator();
iter.hasNext(); ) {
Map.Entry entry = (Map.Entry) iter.next();
assertSame(entry.getKey(), nodes[x].getKey());
assertSame(entry.getValue(), nodes[x]);
x++;
}
}
/**
* test keySetByValue() method
*/
public void testKeySetByValue() {
testKeySetByValue((DoubleOrderedMap) makeMap());
DoubleOrderedMap m = (DoubleOrderedMap) makeMap();
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
testKeySetByValue(m);
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
int count = m.size();
for (Iterator iter = m.keySetByValue().iterator(); iter.hasNext(); )
{
iter.next();
iter.remove();
--count;
assertEquals(count, m.size());
}
assertTrue(m.isEmpty());
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
Set s = m.keySetByValue();
try {
s.remove(null);
fail("should have caught NullPointerException");
} catch (NullPointerException ignored) {}
try {
s.remove(new Object());
fail("should have caught ClassCastException");
} catch (ClassCastException ignored) {}
for (int k = 0; k < nodes.length; k++) {
Comparable key = nodes[k].getKey();
assertTrue(s.remove(key));
assertTrue(!s.contains(key));
assertTrue(!m.containsKey(key));
assertTrue(!m.containsValue(nodes[k]));
}
assertTrue(m.isEmpty());
m = (DoubleOrderedMap) makeMap();
Collection c1 = new LinkedList();
Collection c2 = new LinkedList();
c2.add(new Integer(-99));
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
c1.add(nodes[k].getKey());
c2.add(nodes[k].getKey());
}
assertTrue(m.keySetByValue().containsAll(c1));
assertTrue(!m.keySetByValue().containsAll(c2));
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
c1.add(new Integer(-55));
try {
m.keySetByValue().addAll(c1);
fail("should have caught exception of addAll()");
} catch (UnsupportedOperationException ignored) {}
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
c1.add(nodes[k].getKey());
}
assertTrue(!m.keySetByValue().retainAll(c1));
assertEquals(nodes.length, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
if (k % 2 == 1) {
c1.add(nodes[k].getKey());
}
}
assertTrue(m.keySetByValue().retainAll(c1));
assertEquals(nodes.length / 2, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
assertTrue(m.keySetByValue().retainAll(c1));
assertEquals(0, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
assertTrue(!m.keySetByValue().removeAll(c1));
assertEquals(nodes.length, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
if (k % 2 == 0) {
c1.add(nodes[k].getKey());
}
}
assertTrue(m.keySetByValue().removeAll(c1));
assertEquals(nodes.length / 2, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
c1.add(nodes[k].getKey());
}
assertTrue(m.keySetByValue().removeAll(c1));
assertEquals(0, m.size());
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
m.keySetByValue().clear();
assertEquals(0, m.size());
}
/**
* test valuesByValue() method
*/
public void testValuesByValue() {
testValuesByValue((DoubleOrderedMap) makeMap());
DoubleOrderedMap m = (DoubleOrderedMap) makeMap();
LocalTestNode nodes[] = makeLocalNodes();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
testValuesByValue(m);
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
int count = m.size();
for (Iterator iter = m.valuesByValue().iterator(); iter.hasNext(); )
{
iter.next();
iter.remove();
--count;
assertEquals(count, m.size());
}
assertTrue(m.isEmpty());
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
count = m.size();
Collection s = m.valuesByValue();
for (int k = 0; k < count; k++) {
assertTrue(s.remove(nodes[k]));
assertTrue(!s.contains(nodes[k]));
assertTrue(!m.containsKey(nodes[k].getKey()));
assertTrue(!m.containsValue(nodes[k]));
}
assertTrue(m.isEmpty());
m = (DoubleOrderedMap) makeMap();
Collection c1 = new LinkedList();
Collection c2 = new LinkedList();
c2.add(new LocalTestNode(-123));
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
c1.add(nodes[k]);
c2.add(nodes[k]);
}
assertTrue(m.valuesByValue().containsAll(c1));
assertTrue(!m.valuesByValue().containsAll(c2));
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
c1.add(nodes[k]);
}
try {
m.valuesByValue().addAll(c1);
fail("should have caught exception of addAll()");
} catch (UnsupportedOperationException ignored) {}
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
c1.add(nodes[k]);
}
assertTrue(!m.valuesByValue().retainAll(c1));
assertEquals(nodes.length, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
if (k % 2 == 1) {
c1.add(nodes[k]);
}
}
assertTrue(m.valuesByValue().retainAll(c1));
assertEquals(nodes.length / 2, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
assertTrue(m.valuesByValue().retainAll(c1));
assertEquals(0, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
assertTrue(!m.valuesByValue().removeAll(c1));
assertEquals(nodes.length, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
if (k % 2 == 0) {
c1.add(nodes[k]);
}
}
assertTrue(m.valuesByValue().removeAll(c1));
assertEquals(nodes.length / 2, m.size());
m = (DoubleOrderedMap) makeMap();
c1 = new LinkedList();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
c1.add(nodes[k]);
}
assertTrue(m.valuesByValue().removeAll(c1));
assertEquals(0, m.size());
m = (DoubleOrderedMap) makeMap();
for (int k = 0; k < nodes.length; k++) {
m.put(nodes[k].getKey(), nodes[k]);
}
m.valuesByValue().clear();
assertEquals(0, m.size());
}
/* ********** START helper methods ********** */
private void testKeySet(final Map m) {
Set s = m.keySet();
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
LocalTestNode node = new LocalTestNode(-1);
m.put(node.getKey(), node);
assertTrue(s.contains(node.getKey()));
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
m.remove(node.getKey());
assertTrue(!s.contains(node.getKey()));
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
try {
s.contains(null);
fail("should have caught NullPointerException");
} catch (NullPointerException ignored) {}
try {
s.contains(new Object());
fail("should have caught ClassCastException");
} catch (ClassCastException ignored) {}
for (int k = 0; k < m.size(); k++) {
assertTrue(s.contains(new Integer(k)));
}
int count = 0;
for (Iterator iter = s.iterator(); iter.hasNext(); ) {
iter.next();
++count;
}
assertEquals(count, s.size());
// force the map to have some content
m.put(node.getKey(), node);
Iterator iter = m.keySet().iterator();
LocalTestNode node2 = new LocalTestNode(-2);
m.put(node2.getKey(), node2);
try {
iter.next();
fail("next() should have thrown an exception after a put");
} catch (ConcurrentModificationException ignored) {}
m.remove(node2.getKey());
iter = s.iterator();
m.remove(node.getKey());
try {
iter.next();
fail("next() should have thrown an exception after a Map remove");
} catch (ConcurrentModificationException ignored) {}
m.put(node.getKey(), node);
iter = s.iterator();
s.remove(node.getKey());
try {
iter.next();
fail("next() should have thrown an exception after a Set remove");
} catch (ConcurrentModificationException ignored) {}
iter = s.iterator();
count = 0;
boolean terminated = false;
try {
while (true) {
iter.next();
++count;
}
} catch (NoSuchElementException ignored) {
terminated = true;
}
assertTrue(terminated);
assertEquals(m.size(), count);
iter = s.iterator();
try {
iter.remove();
fail("Should have thrown exception");
} catch (IllegalStateException ignored) {}
m.put(node.getKey(), node);
iter = s.iterator();
iter.next();
m.put(node2.getKey(), node2);
try {
iter.remove();
fail("should have thrown exception");
} catch (ConcurrentModificationException ignored) {}
Iterator iter2 = s.iterator();
iter2.next();
LocalTestNode node3 = new LocalTestNode(-3);
m.put(node3.getKey(), node3);
try {
iter2.remove();
fail("should have thrown exception");
} catch (ConcurrentModificationException ignored) {}
int removalCount = 0;
for (iter = s.iterator(); iter.hasNext(); ) {
if (iter.next().equals(node.getKey())) {
try {
iter.remove();
++removalCount;
iter.remove();
fail("2nd remove should have failed");
} catch (IllegalStateException ignored) {
assertEquals(1, removalCount);
}
}
}
assertEquals(1, removalCount);
assertTrue(!s.contains(node.getKey()));
removalCount = 0;
m.put(node.getKey(), node);
Object[] a1 = s.toArray();
assertEquals(s.size(), a1.length);
if (a1.length > 1) {
Comparable first = (Comparable) a1[0];
for (int k = 1; k < a1.length; k++) {
Comparable second = (Comparable) a1[k];
assertTrue(first.compareTo(second) < 0);
first = second;
}
iter = s.iterator();
first = (Comparable) iter.next();
for (; iter.hasNext(); ) {
Comparable second = (Comparable) iter.next();
assertTrue(first.compareTo(second) < 0);
first = second;
}
}
try {
String array2[] = (String[]) s.toArray(new String[0]);
if (s.size() != 0) {
fail("should have caught exception creating an invalid array");
}
} catch (ArrayStoreException ignored) {}
Comparable array2[] = (Comparable[]) s.toArray(new Comparable[0]);
Integer array3[] = (Integer[]) s.toArray(new Integer[s.size()]);
if (array3.length > 1) {
Integer first = array3[0];
for (int k = 1; k < array3.length; k++) {
Integer second = array3[k];
assertTrue(first.compareTo(second) < 0);
first = second;
}
}
try {
s.add("foo");
fail("should have thrown an exception");
} catch (UnsupportedOperationException ignored) {}
assertTrue(!s.equals(null));
assertEquals(s, s);
Set hs = new HashSet(s);
assertEquals(s, hs);
assertEquals(hs, s);
assertEquals(s.hashCode(), hs.hashCode());
}
private void testKeySetByValue(final DoubleOrderedMap m) {
Set s = m.keySetByValue();
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
LocalTestNode node = new LocalTestNode(-1);
m.put(node.getKey(), node);
assertTrue(s.contains(node.getKey()));
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
m.remove(node.getKey());
assertTrue(!s.contains(node.getKey()));
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
try {
s.contains(null);
fail("should have caught NullPointerException");
} catch (NullPointerException ignored) {}
try {
s.contains(new Object());
fail("should have caught ClassCastException");
} catch (ClassCastException ignored) {}
for (int k = 0; k < m.size(); k++) {
assertTrue(s.contains(new Integer(k)));
}
int count = 0;
for (Iterator iter = s.iterator(); iter.hasNext(); ) {
iter.next();
++count;
}
assertEquals(count, s.size());
// force the map to have some content
m.put(node.getKey(), node);
Iterator iter = m.keySetByValue().iterator();
LocalTestNode node2 = new LocalTestNode(-2);
m.put(node2.getKey(), node2);
try {
iter.next();
fail("next() should have thrown an exception after a put");
} catch (ConcurrentModificationException ignored) {}
m.remove(node2.getKey());
iter = s.iterator();
m.remove(node.getKey());
try {
iter.next();
fail("next() should have thrown an exception after a Map remove");
} catch (ConcurrentModificationException ignored) {}
m.put(node.getKey(), node);
iter = s.iterator();
s.remove(node.getKey());
try {
iter.next();
fail("next() should have thrown an exception after a Set remove");
} catch (ConcurrentModificationException ignored) {}
iter = s.iterator();
count = 0;
boolean terminated = false;
try {
while (true) {
iter.next();
++count;
}
} catch (NoSuchElementException ignored) {
terminated = true;
}
assertTrue(terminated);
assertEquals(m.size(), count);
iter = s.iterator();
try {
iter.remove();
fail("Should have thrown exception");
} catch (IllegalStateException ignored) {}
m.put(node.getKey(), node);
iter = s.iterator();
iter.next();
m.put(node2.getKey(), node2);
try {
iter.remove();
fail("should have thrown exception");
} catch (ConcurrentModificationException ignored) {}
Iterator iter2 = s.iterator();
iter2.next();
LocalTestNode node3 = new LocalTestNode(-3);
m.put(node3.getKey(), node3);
try {
iter2.remove();
fail("should have thrown exception");
} catch (ConcurrentModificationException ignored) {}
int removalCount = 0;
for (iter = s.iterator(); iter.hasNext(); ) {
if (iter.next().equals(node.getKey())) {
try {
iter.remove();
++removalCount;
iter.remove();
fail("2nd remove should have failed");
} catch (IllegalStateException ignored) {
assertEquals(1, removalCount);
}
}
}
assertEquals(1, removalCount);
assertTrue(!s.contains(node.getKey()));
removalCount = 0;
m.put(node.getKey(), node);
Object[] a1 = s.toArray();
assertEquals(s.size(), a1.length);
// if (a1.length > 1)
// {
// Comparable first = ( Comparable ) a1[ 0 ];
// for (int k = 1; k < a1.length; k++)
// {
// Comparable second = ( Comparable ) a1[ k ];
// assertTrue(first.compareTo(second) < 0);
// first = second;
// }
// iter = s.iterator();
// first = ( Comparable ) iter.next();
// for (; iter.hasNext(); )
// {
// Comparable second = ( Comparable ) iter.next();
// assertTrue(first.compareTo(second) < 0);
// first = second;
// }
// }
try {
String array2[] = (String[]) s.toArray(new String[0]);
if (s.size() != 0) {
fail("should have caught exception creating an invalid array");
}
} catch (ArrayStoreException ignored) {}
Comparable array2[] = (Comparable[]) s.toArray(new Comparable[0]);
Integer array3[] = (Integer[]) s.toArray(new Integer[s.size()]);
// if (array3.length > 1)
// {
// Integer first = array3[ 0 ];
// for (int k = 1; k < array3.length; k++)
// {
// Integer second = array3[ k ];
// assertTrue(first.compareTo(second) < 0);
// first = second;
// }
// }
try {
s.add("foo");
fail("should have thrown an exception");
} catch (UnsupportedOperationException ignored) {}
assertTrue(!s.equals(null));
assertEquals(s, s);
Set hs = new HashSet(s);
assertEquals(s, hs);
assertEquals(hs, s);
assertEquals(s.hashCode(), hs.hashCode());
}
private void testValues(Map m) {
Collection s = m.values();
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
LocalTestNode node = new LocalTestNode(-1);
m.put(node.getKey(), node);
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
m.remove(node.getKey());
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
assertTrue(!s.contains(node));
for (int k = 0; k < m.size(); k++) {
assertTrue(s.contains(new LocalTestNode(k)));
}
m.put(node.getKey(), node);
assertTrue(s.contains(node));
m.remove(node.getKey());
assertTrue(!s.contains(node));
int count = 0;
for (Iterator iter = s.iterator(); iter.hasNext(); ) {
iter.next();
++count;
}
assertEquals(s.size(), count);
LocalTestNode node4 = new LocalTestNode(-4);
m.put(node4.getKey(), node4);
Iterator iter = s.iterator();
m.put(node.getKey(), node);
try {
iter.next();
fail("next() should have thrown an exception after a put");
} catch (ConcurrentModificationException ignored) {}
iter = s.iterator();
m.remove(node.getKey());
try {
iter.next();
fail("next() should have thrown an exception after a Map remove");
} catch (ConcurrentModificationException ignored) {}
m.put(node.getKey(), node);
iter = s.iterator();
s.remove(node);
try {
iter.next();
fail("next() should have thrown an exception after a Set remove");
} catch (ConcurrentModificationException ignored) {}
iter = s.iterator();
count = 0;
boolean terminated = false;
try {
while (true) {
iter.next();
++count;
}
} catch (NoSuchElementException ignored) {
terminated = true;
}
assertTrue(terminated);
assertEquals(m.size(), count);
iter = s.iterator();
try {
iter.remove();
fail("Should have thrown exception");
} catch (IllegalStateException ignored) {}
Iterator iter2 = s.iterator();
try {
iter2.remove();
fail("Should have thrown exception");
} catch (IllegalStateException ignored) {}
m.put(node.getKey(), node);
iter = s.iterator();
iter.next();
LocalTestNode node2 = new LocalTestNode(-2);
m.put(node2.getKey(), node2);
try {
iter.remove();
fail("should have thrown exception");
} catch (ConcurrentModificationException ignored) {}
LocalTestNode node3 = new LocalTestNode(-3);
m.put(node3.getKey(), node3);
iter2 = s.iterator();
while (iter2.hasNext()) {
iter2.next();
}
int removalCount = 0;
for (iter = s.iterator(); iter.hasNext(); ) {
if (iter.next().equals(node3)) {
try {
iter.remove();
++removalCount;
iter.remove();
fail("2nd remove should have failed");
} catch (IllegalStateException ignored) {
assertEquals(1, removalCount);
}
}
}
assertEquals(1, removalCount);
assertTrue(!s.contains(node3));
Object[] a1 = s.toArray();
assertEquals(s.size(), a1.length);
if (a1.length > 1) {
Comparable first = (Comparable) a1[0];
for (int k = 1; k < a1.length; k++) {
Comparable second = (Comparable) a1[k];
assertTrue(first.compareTo(second) < 0);
first = second;
}
iter = s.iterator();
first = (Comparable) iter.next();
for (; iter.hasNext(); ) {
Comparable second = (Comparable) iter.next();
assertTrue(first.compareTo(second) < 0);
first = second;
}
}
try {
String array2[] = (String[]) s.toArray(new String[0]);
if (s.size() != 0) {
fail("should have caught exception creating an invalid array");
}
} catch (ArrayStoreException ignored) {}
m.remove(node.getKey());
m.remove(node2.getKey());
m.remove(node3.getKey());
LocalTestNode array2[] =
(LocalTestNode[]) s.toArray(new LocalTestNode[0]);
LocalTestNode array3[] =
(LocalTestNode[]) s.toArray(new LocalTestNode[s.size()]);
if (array3.length > 1) {
LocalTestNode first = array3[0];
for (int k = 1; k < array3.length; k++) {
LocalTestNode second = array3[k];
assertTrue(first.compareTo(second) < 0);
first = second;
}
}
try {
s.add(node.getKey());
fail("should have thrown an exception");
} catch (UnsupportedOperationException ignored) {}
assertTrue(!s.equals(null));
assertEquals(s, s);
Set hs = new HashSet(s);
assertTrue(!s.equals(hs));
assertTrue(!hs.equals(s));
}
private void testValuesByValue(DoubleOrderedMap m) {
Collection s = m.valuesByValue();
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
LocalTestNode node = new LocalTestNode(-1);
m.put(node.getKey(), node);
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
m.remove(node.getKey());
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
assertTrue(!s.contains(node));
for (int k = 0; k < m.size(); k++) {
assertTrue(s.contains(new LocalTestNode(k)));
}
m.put(node.getKey(), node);
assertTrue(s.contains(node));
m.remove(node.getKey());
assertTrue(!s.contains(node));
int count = 0;
for (Iterator iter = s.iterator(); iter.hasNext(); ) {
iter.next();
++count;
}
assertEquals(s.size(), count);
LocalTestNode node4 = new LocalTestNode(-4);
m.put(node4.getKey(), node4);
Iterator iter = s.iterator();
m.put(node.getKey(), node);
try {
iter.next();
fail("next() should have thrown an exception after a put");
} catch (ConcurrentModificationException ignored) {}
iter = s.iterator();
m.remove(node.getKey());
try {
iter.next();
fail("next() should have thrown an exception after a Map remove");
} catch (ConcurrentModificationException ignored) {}
m.put(node.getKey(), node);
iter = s.iterator();
s.remove(node);
try {
iter.next();
fail("next() should have thrown an exception after a Set remove");
} catch (ConcurrentModificationException ignored) {}
iter = s.iterator();
count = 0;
boolean terminated = false;
try {
while (true) {
iter.next();
++count;
}
} catch (NoSuchElementException ignored) {
terminated = true;
}
assertTrue(terminated);
assertEquals(m.size(), count);
iter = s.iterator();
try {
iter.remove();
fail("Should have thrown exception");
} catch (IllegalStateException ignored) {}
Iterator iter2 = s.iterator();
try {
iter2.remove();
fail("Should have thrown exception");
} catch (IllegalStateException ignored) {}
m.put(node.getKey(), node);
iter = s.iterator();
iter.next();
LocalTestNode node2 = new LocalTestNode(-2);
m.put(node2.getKey(), node2);
try {
iter.remove();
fail("should have thrown exception");
} catch (ConcurrentModificationException ignored) {}
LocalTestNode node3 = new LocalTestNode(-3);
m.put(node3.getKey(), node3);
iter2 = s.iterator();
while (iter2.hasNext()) {
iter2.next();
}
int removalCount = 0;
for (iter = s.iterator(); iter.hasNext(); ) {
if (iter.next().equals(node3)) {
try {
iter.remove();
++removalCount;
iter.remove();
fail("2nd remove should have failed");
} catch (IllegalStateException ignored) {
assertEquals(1, removalCount);
}
}
}
assertEquals(1, removalCount);
assertTrue(!s.contains(node3));
Object[] a1 = s.toArray();
assertEquals(s.size(), a1.length);
try {
String array2[] = (String[]) s.toArray(new String[0]);
if (s.size() != 0) {
fail("should have caught exception creating an invalid array");
}
} catch (ArrayStoreException ignored) {}
m.remove(node.getKey());
m.remove(node2.getKey());
m.remove(node3.getKey());
LocalTestNode array2[] =
(LocalTestNode[]) s.toArray(new LocalTestNode[0]);
LocalTestNode array3[] =
(LocalTestNode[]) s.toArray(new LocalTestNode[s.size()]);
try {
s.add(node.getKey());
fail("should have thrown an exception");
} catch (UnsupportedOperationException ignored) {}
assertTrue(!s.equals(null));
assertEquals(s, s);
Set hs = new HashSet(s);
assertTrue(!s.equals(hs));
assertTrue(!hs.equals(s));
}
private void testEntrySet(Map m) {
Set s = m.entrySet();
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
LocalTestNode node = new LocalTestNode(-1);
m.put(node.getKey(), node);
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
m.remove(node.getKey());
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
int count = 0;
for (Iterator iter = s.iterator(); iter.hasNext(); ) {
iter.next();
++count;
}
assertEquals(s.size(), count);
LocalTestNode node2 = new LocalTestNode(-2);
if (m.size() == 0) {
m.put(node2.getKey(), node2);
}
Iterator iter = s.iterator();
m.put(node.getKey(), node);
try {
iter.next();
fail("next() should have thrown an exception after a put");
} catch (ConcurrentModificationException ignored) {}
m.remove(node2.getKey());
iter = s.iterator();
m.remove(node.getKey());
try {
iter.next();
fail("next() should have thrown an exception after a Map remove");
} catch (ConcurrentModificationException ignored) {}
m.put(node.getKey(), node);
iter = s.iterator();
count = 0;
boolean terminated = false;
try {
while (true) {
iter.next();
++count;
}
} catch (NoSuchElementException ignored) {
terminated = true;
}
assertTrue(terminated);
assertEquals(m.size(), count);
iter = s.iterator();
try {
iter.remove();
fail("Should have thrown exception");
} catch (IllegalStateException ignored) {}
iter = s.iterator();
iter.next();
LocalTestNode node3 = new LocalTestNode(-3);
m.put(node3.getKey(), node3);
try {
iter.remove();
fail("should have thrown exception");
} catch (ConcurrentModificationException ignored) {}
int removalCount = 0;
int when = m.size() / 2;
int timer = 0;
for (iter = s.iterator(); iter.hasNext(); ) {
iter.next();
if (timer == when) {
try {
iter.remove();
++removalCount;
iter.remove();
fail("2nd remove should have failed");
} catch (IllegalStateException ignored) {
assertEquals(1, removalCount);
}
}
timer++;
}
assertEquals(1, removalCount);
Iterator iter2 = s.iterator();
try {
iter2.remove();
fail("Should have thrown exception");
} catch (IllegalStateException ignored) {}
iter2 = s.iterator();
while (iter2.hasNext()) {
iter2.next();
}
LocalTestNode node4 = new LocalTestNode(-4);
m.put(node4.getKey(), node4);
try {
iter2.remove();
fail("should have thrown exception");
} catch (ConcurrentModificationException ignored) {}
Object[] a1 = s.toArray();
assertEquals(s.size(), a1.length);
if (a1.length > 1) {
Map.Entry first = (Map.Entry) a1[0];
for (int k = 1; k < a1.length; k++) {
Map.Entry second = (Map.Entry) a1[k];
assertTrue(((Comparable) first.getKey())
.compareTo((Comparable) second.getKey()) < 0);
first = second;
}
iter = s.iterator();
first = (Map.Entry) iter.next();
for (; iter.hasNext(); ) {
Map.Entry second = (Map.Entry) iter.next();
assertTrue(((Comparable) first.getKey())
.compareTo((Comparable) second.getKey()) < 0);
first = second;
}
}
try {
Integer array2[] = (Integer[]) s.toArray(new Integer[0]);
if (s.size() != 0) {
fail("should have caught exception creating an invalid array");
}
} catch (ArrayStoreException ignored) {}
Map.Entry array2[] = (Map.Entry[]) s.toArray(new Map.Entry[0]);
Map.Entry array3[] = (Map.Entry[]) s.toArray(new Map.Entry[s.size()]);
if (array3.length > 1) {
Comparable first = (Comparable) ((Map.Entry) array3[0]).getKey();
for (int k = 1; k < array3.length; k++) {
Comparable second =
(Comparable) ((Map.Entry) array3[k]).getKey();
assertTrue(first.compareTo(second) < 0);
first = second;
}
}
try {
s.add(node.getKey());
fail("should have thrown an exception");
} catch (UnsupportedOperationException ignored) {}
assertTrue(!s.equals(null));
assertEquals("SetEquality 1", s, s);
Set hs = new HashSet(s);
assertEquals("SetEquality 2", s, hs);
assertEquals("SetEquality 3", hs, s);
assertEquals(s.hashCode(), hs.hashCode());
}
private void testEntrySetByValue(DoubleOrderedMap m) {
Set s = m.entrySetByValue();
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
LocalTestNode node = new LocalTestNode(-1);
m.put(node.getKey(), node);
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
m.remove(node.getKey());
assertEquals(m.size(), s.size());
assertEquals(m.isEmpty(), s.isEmpty());
int count = 0;
for (Iterator iter = s.iterator(); iter.hasNext(); ) {
iter.next();
++count;
}
assertEquals(s.size(), count);
LocalTestNode node2 = new LocalTestNode(-2);
if (m.size() == 0) {
m.put(node2.getKey(), node2);
}
Iterator iter = s.iterator();
m.put(node.getKey(), node);
try {
iter.next();
fail("next() should have thrown an exception after a put");
} catch (ConcurrentModificationException ignored) {}
m.remove(node2.getKey());
iter = s.iterator();
m.remove(node.getKey());
try {
iter.next();
fail("next() should have thrown an exception after a Map remove");
} catch (ConcurrentModificationException ignored) {}
m.put(node.getKey(), node);
iter = s.iterator();
count = 0;
boolean terminated = false;
try {
while (true) {
iter.next();
++count;
}
} catch (NoSuchElementException ignored) {
terminated = true;
}
assertTrue(terminated);
assertEquals(m.size(), count);
iter = s.iterator();
try {
iter.remove();
fail("Should have thrown exception");
} catch (IllegalStateException ignored) {}
iter = s.iterator();
iter.next();
LocalTestNode node3 = new LocalTestNode(-3);
m.put(node3.getKey(), node3);
try {
iter.remove();
fail("should have thrown exception");
} catch (ConcurrentModificationException ignored) {}
int removalCount = 0;
int when = m.size() / 2;
int timer = 0;
for (iter = s.iterator(); iter.hasNext(); ) {
iter.next();
if (timer == when) {
try {
iter.remove();
++removalCount;
iter.remove();
fail("2nd remove should have failed");
} catch (IllegalStateException ignored) {
assertEquals(1, removalCount);
}
}
timer++;
}
assertEquals(1, removalCount);
Iterator iter2 = s.iterator();
try {
iter2.remove();
fail("Should have thrown exception");
} catch (IllegalStateException ignored) {}
iter2 = s.iterator();
while (iter2.hasNext()) {
iter2.next();
}
LocalTestNode node4 = new LocalTestNode(-4);
m.put(node4.getKey(), node4);
try {
iter2.remove();
fail("should have thrown exception");
} catch (ConcurrentModificationException ignored) {}
Object[] a1 = s.toArray();
assertEquals(s.size(), a1.length);
if (a1.length > 1) {
Map.Entry first = (Map.Entry) a1[0];
for (int k = 1; k < a1.length; k++) {
Map.Entry second = (Map.Entry) a1[k];
assertTrue(((Comparable) first.getKey())
.compareTo((Comparable) second.getKey()) < 0);
first = second;
}
iter = s.iterator();
first = (Map.Entry) iter.next();
for (; iter.hasNext(); ) {
Map.Entry second = (Map.Entry) iter.next();
assertTrue(((Comparable) first.getKey())
.compareTo((Comparable) second.getKey()) < 0);
first = second;
}
}
try {
Integer array2[] = (Integer[]) s.toArray(new Integer[0]);
if (s.size() != 0) {
fail("should have caught exception creating an invalid array");
}
} catch (ArrayStoreException ignored) {}
Map.Entry array2[] = (Map.Entry[]) s.toArray(new Map.Entry[0]);
Map.Entry array3[] = (Map.Entry[]) s.toArray(new Map.Entry[s.size()]);
if (array3.length > 1) {
Comparable first =
(Comparable) ((Map.Entry) array3[0]).getValue();
for (int k = 1; k < array3.length; k++) {
Comparable second =
(Comparable) ((Map.Entry) array3[k]).getValue();
assertTrue(first.compareTo(second) < 0);
first = second;
}
}
try {
s.add(node.getKey());
fail("should have thrown an exception");
} catch (UnsupportedOperationException ignored) {}
assertTrue(!s.equals(null));
assertEquals("SetEquality 1", s, s);
Set hs = new HashSet(s);
assertEquals("SetEquality 2", s, hs);
assertEquals("SetEquality 3", hs, s);
assertEquals(s.hashCode(), hs.hashCode());
}
private LocalTestNode[] makeLocalNodes() {
LocalTestNode nodes[] = new LocalTestNode[1023];
for (int k = 0; k < nodes.length; k++) {
nodes[k] = new LocalTestNode(k);
}
return nodes;
}
/* ********** END helper methods ********** */
/**
* Method main
*
* @param unusedArgs
*/
public static void main(final String unusedArgs[]) {
junit.textui.TestRunner.run(TestDoubleOrderedMap.class);
}
}